const router = require("koa-router")();
const JWT = require("jsonwebtoken");
const { secret } = require("../config/keys");
let userList = require("../mock/user.json");
const fs = require("fs");
const path = require("path");

/**
 * @swagger
 * /login: #接口访问路径(拼接上之前swagger.js中的host蛇者)
 *   post: #请求方式
 *     summary: 登录  #接口信息
 *     description: 用户登录 #接口描述
 *     tags: [用户] #接口分组
 *     produces:
 *       - application/x-www-form-urlencoded
 *     parameters: #传递参数
 *       - name: username #参数名字
 *         description: 用户名 #参数信息
 *         in: formData #参数存放位置formData是存放到请求体中
 *         required: true #是否是必传参数
 *         type: string #参数类型
 *       - name: password
 *         description: 密码
 *         in: formData
 *         required: true
 *         type: string
 *     responses: #返回结果
 *       1000:
 *         description: 成功
 */

router.post("/login", (ctx) => {
  // 1. 获取用户 密码
  const { username, password } = ctx.request.body;
  // 2. 查找
  const item = userList.find((v) => {
    return v.username === username && v.password === password;
  });
  // 3. 验证
  if (item) {
    // 存在
    ctx.body = {
      code: 10000,
      data: {
        userInfo: item,
        accessToken: JWT.sign(
          { ...item, time: new Date().getTime(), timeout: 1000 * 2 },
          secret
        ),
        refreshToken: JWT.sign(
          { ...item, time: new Date().getTime(), timeout: 1000 * 60 * 60 * 24 },
          secret
        ),
      },
      message: "登录成功， 欢迎用户 " + item.nickname,
    };
  } else {
    // 不存在
    ctx.body = {
      code: 40004,
      message: "账户密码错误， 请重新登录",
    };
  }
});

/**
 * @swagger
 * /quit: #接口访问路径(拼接上之前swagger.js中的host蛇者)
 *   post: #请求方式
 *     summary: 退出登录  #接口信息
 *     description: 用户退出登录 #接口描述
 *     tags: [用户] #接口分组
 *     produces:
 *       - application/x-www-form-urlencoded
 *     responses: #返回结果
 *       1000:
 *         description: 成功
 */

router.post("/quit", (ctx) => {
  ctx.body = {
    code: 10000,
    message: "退出登录成功",
  };
});

/**
 * @swagger
 * /register: #接口访问路径(拼接上之前swagger.js中的host蛇者)
 *   post: #请求方式
 *     summary: 注册  #接口信息
 *     description: 用户注册 #接口描述
 *     tags: [用户] #接口分组
 *     produces:
 *       - application/x-www-form-urlencoded
 *     parameters: #传递参数
 *       - name: username #参数名字
 *         description: 用户名 #参数信息
 *         in: formData #参数存放位置formData是存放到请求体中
 *         required: true #是否是必传参数
 *         type: string #参数类型
 *       - name: password
 *         description: 密码
 *         in: formData
 *         required: true
 *         type: string
 *     responses: #返回结果
 *       1000:
 *         description: 成功
 */

router.post("/register", (ctx) => {
  // 1. 获取用户 密码
  const { username, password, rolename = "普通用户" } = ctx.request.body;
  // 2. 查找
  const item = userList.find((v) => {
    return v.username === username;
  });
  // 3. 验证
  if (item) {
    // 存在
    ctx.body = {
      code: 40000,
      message: "该用户已经存在， 请重新注册",
    };
  } else {
    userList.push({
      username,
      password,
      nickname: username,
      avator: `https://robohash.org/${Math.random()
        .toString()
        .slice(2, 8)}?set=set3`,
      role: "user",
      id: Math.random().toString().slice(2),
      rolename,
    });
    fs.writeFileSync(
      path.resolve(__dirname, "../mock/user.json"),
      JSON.stringify(userList)
    );
    // 不存在
    ctx.body = {
      code: 10000,
      message: "注册成功",
    };
  }
});

/**
 * @swagger
 * /user: #接口访问路径(拼接上之前swagger.js中的host蛇者)
 *   post: #请求方式
 *     summary: 修改账户（需要权限）  #接口信息
 *     description: 用户数据修改 #接口描述
 *     tags: [用户] #接口分组
 *     produces:
 *       - application/x-www-form-urlencoded
 *     parameters: #传递参数
 *       - name: id #参数名字
 *         description: id #参数信息
 *         in: formData #参数存放位置formData是存放到请求体中
 *         required: true #是否是必传参数
 *         type: number #参数类型
 *       - name: username
 *         description: 用户名
 *         in: formData
 *         type: string
 *       - name: password
 *         description: 密码
 *         in: formData
 *         type: string
 *       - name: avatar
 *         description: 头像
 *         in: formData
 *         type: string
 *       - name: nickname
 *         description: 昵称
 *         in: formData
 *         type: string
 *       - name: state
 *         description: 状态
 *         in: formData
 *         type: boolean
 *       - name: tip
 *         description: 提示
 *         in: formData
 *         type: string
 *     responses: #返回结果
 *       1000:
 *         description: 成功
 */

router.post("/user", (ctx) => {
  const body = ctx.request.body;
  const item = userList.find((v) => v.id == body.id);
  if (item) {
    Object.assign(item, body);
    fs.writeFileSync(
      path.resolve(__dirname, "../mock/user.json"),
      JSON.stringify(userList)
    );
    ctx.body = {
      code: 10000,
      message: "数据修改成功",
    };
  } else {
    ctx.body = {
      code: 40000,
      message: "修改的数据不存在",
    };
  }
});

/**
 * @swagger
 * /user/edit: #接口访问路径(拼接上之前swagger.js中的host蛇者)
 *   post: #请求方式
 *     summary: 修改账户(不需要token)  #接口信息
 *     description: 用户数据修改 #接口描述
 *     tags: [用户] #接口分组
 *     produces:
 *       - application/x-www-form-urlencoded
 *     parameters: #传递参数
 *       - name: id #参数名字
 *         description: id #参数信息
 *         in: formData #参数存放位置formData是存放到请求体中
 *         required: true #是否是必传参数
 *         type: number #参数类型
 *       - name: username
 *         description: 用户名
 *         in: formData
 *         type: string
 *       - name: password
 *         description: 密码
 *         in: formData
 *         type: string
 *       - name: avatar
 *         description: 头像
 *         in: formData
 *         type: string
 *       - name: nickname
 *         description: 昵称
 *         in: formData
 *         type: string
 *       - name: state
 *         description: 状态
 *         in: formData
 *         type: boolean
 *       - name: tip
 *         description: 提示
 *         in: formData
 *         type: string
 *     responses: #返回结果
 *       1000:
 *         description: 成功
 */

router.post("/user/edit", (ctx) => {
  const body = ctx.request.body;
  const item = userList.find((v) => v.id == body.id);
  if (item) {
    Object.assign(item, body);
    fs.writeFileSync(
      path.resolve(__dirname, "../mock/user.json"),
      JSON.stringify(userList)
    );
    ctx.body = {
      code: 10000,
      message: "数据修改成功",
    };
  } else {
    ctx.body = {
      code: 40000,
      message: "修改的数据不存在",
    };
  }
});

/**
 * @swagger
 * /users: #接口访问路径(拼接上之前swagger.js中的host蛇者)
 *   get: #请求方式
 *     summary: 获取用户列表  #接口信息
 *     description: 用户数据修改 #接口描述
 *     tags: [用户] #接口分组
 *     parameters:
 *       - name: pageCode
 *         in: query
 *         description: 页码
 *         type: string
 *       - name: pageSize
 *         in: query
 *         description: 每页个数
 *         type: string
 *       - name: nickname
 *         in: query
 *         description: 昵称搜索
 *         type: string
 *       - name: rolename
 *         in: query
 *         description: 角色搜索
 *         type: string
 *       - name: username
 *         in: query
 *         description: 用户名搜索
 *         type: string
 *     responses: #返回结果
 *       1000:
 *         description: 成功
 */
router.get("/users", (ctx) => {
  const {
    nickname,
    rolename,
    username,
    pageSize = 10,
    pageCode = 1,
  } = ctx.request.query;
  const s = userList.filter((v) => {
    if (nickname && !v.nickname) return false;
    if (rolename && !v.rolename) return false;
    if (username && !v.username) return false;

    if (nickname && !v.nickname.includes(nickname)) {
      return false;
    }

    if (rolename && !v.rolename.includes(rolename)) {
      return false;
    }

    if (username && !v.username.includes(username)) {
      return false;
    }

    return true;
  });
  const data = s.slice((pageCode - 1) * pageSize, pageCode * pageSize);
  ctx.body = {
    code: 10000,
    message: "数据获取成功",
    data: {
      data,
      total: s.length,
    },
  };
});

/**
 * @swagger
 * /user:
 *   delete:
 *     summary: 删除账户
 *     description: 删除账户
 *     tags: [用户] #接口分组
 *     parameters:
 *       - name: id
 *         in: query
 *         required: false
 *         description: 删除项目id
 *         type: string
 *     responses:
 *       10000:
 *         description: 成功获取
 */
// 删除 一个  多个
router.delete("/user", (ctx) => {
  // 接受 删除的id
  const { id } = ctx.request.query;
  // 将id 转化为 数组
  // const deleteArrId = id.split(",");
  // 循环筛选数据每一项
  const delIndex = userList.findIndex((v) => {
    // 包含的就删除 ， 不包含留下
    return v.id === id;
  });

  if (delIndex > -1) {
    userList.splice(delIndex, 1);
  } else {
    ctx.body = {
      code: 40000,
      message: "未找到删除的数据",
    };
    return;
  }

  fs.writeFileSync(
    path.resolve(__dirname, "../mock/user.json"),
    JSON.stringify(userList)
  );

  ctx.body = {
    code: 10000,
    message: "ok",
  };
});

/**
 * @swagger
 * /user/info: #接口访问路径(拼接上之前swagger.js中的host蛇者)
 *   get: #请求方式
 *     summary: 获取用户信息  #接口信息
 *     description: 获取用户信息 #接口描述
 *     tags: [用户] #接口分组
 *     parameters:
 *       - name: token
 *         in: query
 *         required: true
 *         description: 用户令牌
 *         type: string
 *     responses: #返回结果
 *       1000:
 *         description: 成功
 */
router.get("/user/info", (ctx) => {
  // 获取 token
  const { token } = ctx.request.query;
  if (!token) {
    ctx.body = {
      code: 40001,
      message: "token 不存在",
    };
  } else {
    // 解析 token  XXX
    try {
      const user = JWT.verify(token, secret);
      ctx.body = {
        code: 10000,
        message: "ok",
        data: {
          ...user,
        },
      };
    } catch {
      ctx.body = {
        code: 40003,
        message: "非法token， 请重新登录",
      };
    }
  }
});

/**
 * @swagger
 * /refreshToken: #接口访问路径(拼接上之前swagger.js中的host蛇者)
 *   get: #请求方式
 *     summary: 刷新accessToken  #接口信息
 *     description: 刷新accessToken #接口描述
 *     tags: [用户] #接口分组
 *     parameters:
 *       - name: refreshToken
 *         in: query
 *         required: true
 *         description: 长token
 *         type: string
 *     responses: #返回结果
 *       1000:
 *         description: 成功
 */
router.get("/refreshToken", async (ctx) => {
  const { refreshToken } = ctx.request.query;
  const item = await JWT.verify(refreshToken, secret);
  ctx.body = {
    code: 10000,
    message: "刷新成功",
    data: {
      accessToken: JWT.sign(
        { ...item, time: new Date().getTime(), timeout: 1000 * 2 },
        secret
      ),
    },
  };
});

// 增删改查

module.exports = router;
